import { getPexelsListApi } from '@/apis/index.js';
import { PexelsItem, PexelsQuery } from '@/types/index.js';
import { defineStore } from 'pinia'

const PAGE_SIZE = 10;

export const usePexelsStore = defineStore('pexels', {
  // 1. 扩展 State，管理所有相关状态
  state: (): {
    list: PexelsItem[],
    total: number,
    page: number, // 当前页码
    isLoading: boolean, // 是否正在加载
    currentCategoryId: string | null // 追踪当前分类ID
  } => ({
    list: [],
    total: 0,
    page: 1,
    isLoading: false,
    currentCategoryId: null,
  }),

  // 2. 使用 Getters 计算衍生状态
  getters: {
    /**
     * 是否已加载全部数据
     * - total > 0 确保我们是在有数据的情况下判断
     * - list.length >= total 表示已加载完毕
     */
    isFinished(state): boolean {
      return state.total > 0 && state.list.length >= state.total;
    }
  },

  // 3. 封装所有业务逻辑到 Actions
  actions: {
    /**
     * 刷新或首次加载列表
     * @param categoryId 分类ID
     */
    async refreshList(categoryId: string) {
      // 如果是新的分类，则重置所有状态
      if (this.currentCategoryId !== categoryId) {
        console.log(`New category detected. Resetting state for ${categoryId}.`);
        this.list = [];
        this.total = 0;
        this.page = 1;
        this.currentCategoryId = categoryId;
      } else {
        // 如果是同一分类的下拉刷新，也重置列表和页码
        console.log(`Refreshing category ${categoryId}.`);
        this.list = [];
        this.page = 1;
      }
      
      // 开始加载第一页
      await this.loadMore();
    },

    /**
     * 加载更多数据（上拉加载）
     */
    async loadMore() {
      // 核心逻辑守卫：如果正在加载或已全部加载完毕，则不执行
      if (this.isLoading || this.isFinished) {
        return;
      }
      if (!this.currentCategoryId) {
        console.warn('Cannot load more without a category ID.');
        return;
      }

      this.isLoading = true;
      try {
        const query: PexelsQuery = {
          categoryId: this.currentCategoryId,
          page: this.page,
          size: PAGE_SIZE
        };
        const res = await getPexelsListApi(query);
        
        // 追加数据而不是替换
        this.list.push(...res.list);
        this.total = res.total;
        
        // 页码 +1，为下一次加载做准备
        this.page++;

      } catch (error) {
        console.error('Failed to load more data:', error);
        // 这里可以添加错误状态处理
      } finally {
        this.isLoading = false;
      }
    },
  }
});
